实战出发 浅谈网络

从十二月初的一个突发奇想 到现在十二月接近尾声 我对网络方面知识进行了一次简单的广度优先搜索(可能也就搜了一两层吧 也可能一层不到)想来还是有些奇妙 这种跟随着好奇心驱使 哪里不会学哪里的方式 emmm 很奇妙 那么现在就是最麻烦也是最让人有成就感的总结整理阶段了

先回顾一下经历吧

起初是好奇网页的编译器是怎么实现的 于是让chatgpt帮我实现一个 实现了之后 我又想着 这个东西该怎么让其他人也访问得到呢 我回忆起了一个叫做docker的东西 关于docker的一些理解在这里就不再赘述 主要谈网络 emm于是发现我的这个编译器可以借助docker运行在服务器上 又正逢阿里云有学生免费租用云服务器的活动 就去试了一下 这后面又发生了很多趣事 比如宝塔面板 ssh远程操控协议 文件传输协议等等等等 又在服务器尝试部署了很多东西 了解了正向反向代理 关于科学上网的原理也在这个时候得到了一定认识 后面我又开始琢磨 能否在本地部署 以及自己的电脑间能否便捷联系起来 就又开始了对局域网的探索 当然也夹杂了一些虚拟机的知识

其实这折射出了一个很典型的过程 以后自己写的项目 程序也好网站也罢 不外乎是要运行在某个端口或者解析在某个域名

项目部署及访问

那么就必须要做两件事

第一:部署项目

第二:让其他人访问到你的项目

对于部署项目可以选择三种方式 1:在当前电脑里面跑项目 2:在虚拟机跑项目 3:在服务器上跑项目 (4.在托管服务器跑)

1:在当前电脑里面跑项目

在当前电脑跑项目非常简单 使用node.js的http-server板块或者用python自带的http.server就可以直接把自己的项目暴露在某个端口号上 也可以使用docker包装一下再使用docker部署在某个端口上

但是 重点来了 自己的电脑是没有公网ip的 (原因是ipv4不够用 不能达到理论上的每台计算机都有一个自己的公网ip 所以实际情况是 只有你的运营商有公网ip 你所用的ip是它层层包装下的某个网段的私有ip 这个ip是无法直接被互联网访问到的 但是ipv6的出现解决了这个问题 它可以真正实现互联网的理想状态 每台设备都有一个能在公网上找到的ip地址 真正实现万物互联 只能说有利有弊吧 你现在不能被网络直接找到虽然有一定不便 但也很大程度的得到了保护 其他人不能直接通过网络攻击你) 因为没有公网ip 其他人是无法访问到你的这个项目的

如何解决这个问题?

(1)如果你只是想几个朋友参观一下你的项目 那么就简单了 构建一个局域网 别被吓到 其实就是开个wifi热点的事情 让朋友的电脑连上你电脑的热点 那么你们的电脑就处于一个局域网内了(手机也行) 直接通过ip+端口号就可以访问——什么 你不知道自己的ip是什么 emm 打开cmd 键入ipconfig 就可以查询到本机ip 但局域网远远不止这些 还有异地组网 路由器本地组网等等等等 后面会详细展开谈谈

(2)如果是像远在几个城市以外的朋友访问你的项目 或是想让互联网的人都来看看 那么就有着一种技术——内网穿透 简单来说它就是将处于私网的本机暴露在公网 这样就能实现访问(显然被攻击的风险提高了 而且比简单服务器被攻击更危险 因为你本地肯定有更重要的数据 有后顾之忧) 因为我没有亲自尝试这件事情 所以就简单介绍一下原理吧 工作原理:内网穿透通过建立从内网设备到一个外部服务器的持久连接来工作。这个外部服务器具有公网IP地址,可以从互联网上被访问。(1)建立连接:内网中的设备(如你的个人电脑或服务器)主动向具有公网IP的穿透服务器发起连接。(2)转发请求:当外部请求达到穿透服务器时,服务器将这些请求转发到之前建立的连接上。(3)响应转发:内网设备处理这些请求并将响应发送回穿透服务器,然后穿透服务器再将响应转发给原始请求者。 实现方法:(1)使用内网穿透服务:市面上有许多提供内网穿透服务的公司,如Ngrok、Frp(Fast Reverse Proxy)、LocalTunnel等。这些服务提供了易于使用的工具来建立和管理内网穿透。(2)手动设置:如果对网络配置比较熟悉,可以手动设置内网穿透。例如,使用SSH隧道或VPN。

但是显然 如果你的需求是第二个(让互联网的人都访问) 还是老老实实使用服务器吧 何必自讨苦吃

2:在虚拟机里面跑项目

虚拟机就是在你的电脑里面使用虚拟机软件如vmware去安装一个新系统 它是隔离的 里面发生什么都不会影响你真实的主机 这不就是一个天然的开发和测试环境嘛 完全没有后顾之忧

但是我对虚拟机的探索目前只停留在选择安装操作系统(centos)或许还有一些在里面进行的docker操作 也能简单部署一下项目 至于访问我想应该也是差不多的 获取虚拟机的ip地址 加上端口号 去进行访问 万变不离其中 在寒假有计划学习一下linux操作系统 我想那时候应该会更深入探索这方面的东西

有个很神奇的地方就是 我本以为我电脑里的虚拟机里跑的项目想被公网访问 也要用内网穿透 只不过少了后顾之忧(因为没什么重要数据) 但它比我想象的更强大 它好像可以直接被公网访问 下面是chatgpt的解释:

虚拟机是一种已经在网络上可访问的环境,虚拟机本身就具有网络连接,可以通过虚拟网络适配器与主机系统通信,并且可以通过本地网络访问,且在虚拟机中运行项目通常是一个独立的环境,因此不需要内网穿透来实现远程访问。在虚拟机中运行项目不会受到与在本地计算机上运行项目相同的IP限制,可以直接使用虚拟机的IP地址和端口号在局域网或互联网上访问项目。前提是你的虚拟机和主机所在的网络配置允许这种访问。

虚拟机网络配置:虚拟机需要配置为具有网络连接,并且可以通过本地网络访问。通常,虚拟机的网络配置可以选择桥接模式,这使得虚拟机可以像物理计算机一样在局域网中存在。确保虚拟机分配了一个合适的IP地址。

主机防火墙设置:确保主机计算机的防火墙不会阻止对虚拟机的访问。你可能需要配置主机防火墙以允许流量通过虚拟机的IP地址和端口。

路由器端口转发:如果你的主机计算机位于一个家庭网络或路由器后面,你可能需要配置路由器以将特定端口上的流量转发到虚拟机的IP地址。这通常被称为端口转发或端口映射。这样,外部网络上的请求将被路由到虚拟机。

公网IP地址:如果你希望从互联网上的任何位置都能够访问虚拟机,那么虚拟机可能需要具有公网IP地址。这通常需要与你的互联网服务提供商(ISP)协调,因为他们分配了公网IP地址。

动态DNS或静态IP:如果你的公网IP地址是动态的(可能会变化),你可以考虑使用动态DNS服务,将一个域名映射到你的动态IP地址。或者,你可以使用静态IP地址。

这部分内容我会在实践后再进行补充

3:在服务器里面跑项目

服务器是有公网ip的 那这样事情就好办多了 直接运行到服务器上去 然后任何设备都可以用ip+端口访问这个项目 或者DNS解析一下 用域名访问

那么问题来了怎么部署到服务器

传统方法是把代码文件全都传到服务器上 在服务器上运行这些代码 显然有一个问题就是环境不同 依赖不同 这就需要在代码方面做很多功夫 提高兼容性 可移植性

docker解决了这个问题 它把一个项目所需要的东西打包在一个盒子里面 然后把这个盒子传到服务器 这样就可以不依赖于运行环境 从而很轻易的解决了兼容性问题

关于传本机文件到服务器(dockerfile总归是要传过去的吧)

我接触到scp命令

SCP(Secure Copy Protocol)是一种用于在本地计算机和远程服务器之间安全传输文件的命令行工具

它基于SSH(Secure Shell)协议,因此提供了数据传输的安全性和加密。

将本地文件复制到远程服务器:scp /path/to/local/file username@remote_server_ip:/path/to/remote/destination

将远程服务器文件复制到本地:scp username@remote_server_ip:/path/to/remote/file /path/to/local/destination

这对于一开始我的服务器是账号密码登入是可行的 当我换成pem验证后 就一直显示windows对于这个pem的安全性疑问不允许我认证 但是后面使用宝塔面板或者finalshell 可以直接拖动 上传文件 也就无需手敲这种命令去传文件了

总的来说在服务器上部署项目或者建站是很简单的 使用图形化工具后就更简单了

享受了几天的疯狂找项目部署的快乐后 我感觉不是很满足 于是就开始了对服务器新一轮的探索

对了补充一个项目部署的方法

4:部署在vercel

Vercel 是一家提供网站托管和部署服务的云平台,专注于前端开发者和团队,支持 Jamstack 架构和 Serverless 功能。Vercel 的主要特点包括:

  1. 即时部署:可以自动从 Git 仓库部署代码,简化了部署流程。

  2. Serverless 函数:支持无服务器架构,允许开发者轻松构建和扩展后端功能。

  3. 全球 CDN:提供全球内容分发网络(CDN),确保网站加载速度。

  4. 优化性能:自动优化网站性能,包括图像优化等。

  5. 集成支持:与多个流行的前端框架和工具链(如 Next.js)紧密集成。

  6. 协作和团队功能:支持团队协作和权限管理。

Vercel 尤其适合开发静态网站和 Jamstack 应用,因为它提供了一个简单、高效的平台来构建、部署和托管现代网络应用。

也就是说 对于一些服务或者项目 可以不必部署到自己的服务器 它与github相成 对于一些项目仅需fork到自己的账号 便可使用vercel一键部署 省时省空间

比如使用vercel部署gemini

https://youtu.be/xefaQug_eyk?si=HZ70WL9YD_xpytMc

这个平台不是一次两次听说了 下次再碰上就深入研究一下吧

服务器再探

服务器肯定不止做些挂服务的事情 我在搭建网站时关注到了一个词——代理 难免与clash的代理产生起了联想 再加上老是听说什么使用服务器代理实现chatgpt国内访问 等等等等 就研究了一下 科学上网的原理

其实归根结底就是两个代理——正向代理 反向代理

照字面意思来理解的话 大概就是 正向代理是代理我的本地电脑 代替我去向服务端发送请求 这样能起到一种加速和隐藏我真实信息的作用 而反向代理是代理真实服务端的服务器 把它映射到我的服务器中 我访问我的服务器就相当于访问服务端服务器 这隐藏了真实服务端的一些细节

正向代理和反向代理

正向代理:

正向代理位于客户端(如您的电脑)和外部服务器(如互联网上的服务)之间。

它代理客户端,帮助客户端请求外部资源。

常用于隐藏客户端的真实IP地址、绕过访问限制、加速访问。

比如:使用Clash访问外网:

Clash作为一个代理工具,帮助本地设备通过设置的代理服务器访问外部网络资源。

这种设置典型地应用于翻墙或绕过地理限制。(开启梯子后连不上校园网 因为ip已经跑到代理服务器上了 这其实就是隐藏了真实ip)

正向代理的进阶应用:内容过滤与监控:正向代理可以用于内容过滤,阻止访问特定网站或服务。它也可以用于监控和记录用户的网上活动,这在企业和教育机构中尤其常见。认证与授权:正向代理可以要求用户进行身份验证,从而控制对网络资源的访问。局限性:正向代理主要用于客户端请求的管理,而不适合大规模的公共网站流量管理。

反向代理:

反向代理位于服务端(如网站服务器)和外部客户端(如互联网用户)之间。

它代理服务端,管理和优化对服务端的请求。

常用于隐藏真实服务器的细节、提供负载均衡、缓存服务、SSL终端化等。

比如:使用反向代理访问ChatGPT:

反向代理服务器被设置为接收来自用户的请求,然后将这些请求转发到ChatGPT的API。

这种设置可以用于提供国内访问OpenAI服务的能力,同时隐藏真实的服务端细节。

反向代理的进阶应用:SSL/TLS 终端化:反向代理可以用于管理SSL/TLS证书,从而加密客户端和服务器之间的通信,同时减轻后端服务器的负担。应用层防火墙:可以配置为应用层防火墙,保护网站不受SQL注入、跨站脚本攻击等网络攻击。全局服务器负载均衡:在多服务器环境中,反向代理可以根据各服务器的负载情况,智能地分配流量。局限性:虽然反向代理提供了安全和性能优化,但如果配置不当,可能成为网络瓶颈或故障点。

很多情况下与域名联系紧密 让我头疼了一个月

尝试实践

这一切的基础肯定是在于一台海外服务器

于是我购买了一台阿里云在新加坡的服务器

(PS:别抱太大期望 失败告终 因为咱的长城可不是盖的 哪有那么容易 噗呲)

反代 绕过域名备案

尝试使用它反向代理我的内陆服务器

将域名绑在海外服务器上 内陆服务器收到的其实不是来自域名的访问而是来自海外服务器的访问

这样可以绕过域名备案的限制

image-5b970d43

虽然没有成功 但是理论是可行的

(买的是阿里云的服务器 实际上还是要过它的防火墙 要真实现得通过外国的vps购买 如Vultr)

正代实现翻墙

然后有个正向代理本机的的想法

转发我的流量 实现clash的功能

(没敢尝试 因为连域名都过不了 这个肯定过不了)

但是大概思路是在海外服务器上配置Shadowsocks、V2Ray 让本地电脑的网络流量通过海外服务器转发,绕过地理位置限制或网络审查。

反代ai

还有一个就是在海外服务器上调api 搞chatgpt或者gemiini 然后用本地服务器反代 但是因为是阿里云的原因 一搞就被墙 然后亚马逊的vps又一直弄不到

总之 魔高一尺道高一丈 理论可行 但咱长城高于理论 有些东西想想就好

知道服务器能做这些事情 自己手上体验到的某些东西别人是这样做的 这样就够了 不要去尝试那些有的没的 得不偿失 服务器对自己的作用还是在于挂网站 挂项目 足够

局域网再探

前面了解到 开热点就可以形成局域网

但这显然存在很明显的地域性 如果我要异地组网怎么办?比如以后家里电脑和公司电脑 我想连起来怎么办

异地组网

使用vpn

(这个名词在翻墙也经常听到 不陌生吧)

原理:使用VPN技术允许地理上分散的设备通过安全的虚拟通道连接,形成一个统一的网络环境。它会创建一个加密的隧道,用于在不安全的互联网上安全传输数据,这涉及到数据的加密解密过程,保护数据在传输过程中不被窃取或篡改,还负责分配私有IP地址给连接的设备,并处理数据包的路由,使得它们能够安全、正确地到达目的地。

用它翻墙的原理大概是在一个中心服务器(海外服务器)上进行安装和配置VPN软件(如OpenVPN或WireGuard)在其他设备(如内陆的服务器和本地电脑)上安装VPN客户端,并配置它们以连接到中心VPN服务器。 确保所有设备都能够通过VPN服务器互相通信,测试网络连接的稳定性和速度。将海外服务器作为流量出口,那么局域网内的所有设备的请求都会在海外服务器发出 从而实现“翻墙”。还是那句话 了解就好 别自己去做

但是对于我现在的情况来说 自己构建vpn隧道有些困难

快速组网 tailscale

如果只是想快速实现异地组网 完全可以直接使用tailscale

只需要在各用户端下载该软件 然后使用同一账号登入 它内部就会做好一系列配置

当然它能做的远不止这些

拓展教程 https://youtu.be/mgDpJX3oNvI?si=LDfgC0jUZmxAbzwA

这是目前已经组好的一个局域网

包含我的手机平板台式机笔记本服务器以及几个朋友的笔记本

2-Learning/03-项目筑基/05-网络与项目/01-网络认知/assets/image-09d89e1d

那么能做什么?

用途

除了前面说的访问端口外

文件

设备间 文件互传

公司电脑编辑了一份文件 要带回家继续做 就得进行一次上传下载

但是 使用syncthing 可以实现 在公司电脑中创建即在家里电脑也创建

两边完全同步

绝妙!

基本设置教程:https://youtu.be/Pt8Fx8-5zLU?si=EevsE\_IUuhXOIBr4

带手机教程(不支持ios):

https://youtu.be/UgdaTsF067g?si=_FS-7-b1tdx5pdKh

它功能很贴切我的需求 虽然现在还没有俩台电脑 又不支持ios 可惜 还在寻找有他一般功能的支持ios的平替软件

现在我能想到的它的功能就是 在学习小组内使用tailscale搭建局域网 然后利用syncthing创建共享文件夹 所有人的设备可以快速的使用或更改里面的文件 而不需要所谓的上传下载 然后也提供版本控制功能(七天回滚 防止手贱)

这可以大大提高效率 协同工作而无需担心其他人做了什么改动 与我本地不一样(比如上次和朋友合做一个网页 他发给我一个版本让我进行修改 我得叮嘱他别使用我改好发给他之前的版本做后面的操作 不然他不知道我改了哪里我也不知道他改了哪里 要合并成最新版本就太麻烦了 显得就像是 同一时间只能一个人做事 还得等我做完了 传给他 他才能继续做 太麻烦太麻烦了 如果这个设想实现 我和他完全可以一起操作 做的修改会同时更新 就像是word的协作文档 即使做错了也有版本管理恢复 真的会是一个很好的愿景

更强大的Resiliosync

不局限于局域网 但在局域网内会更快

然后功能更全

支持ios(几乎所有系统)

https://youtu.be/aT9AwF-Jpzg?si=o6TdmLFkYJVns3\_4

(目前使用的是这个 不过好像没有版本控制 要付费 慢慢考虑到底用哪个吧)

远程

https://youtu.be/_J9tUq50M9c?si=KsvbrIbCsokH_gGl

使用windows自带的远程功能

可以实现局域网内设备远程操控

被控机文件可以直接拖动到本机 妙!

(win11家庭版不支持)

用todesk也够了

只能说 局域网归根结底是网络的一种 它能做的互联网基本也能做

不过是提供了一个更安全 便捷的环境罢了

主要还是对于端口号的便捷 无需内网穿透

其他诸如远程等操作 用平时用的app就够了

本地组网

最近在寝室入手了一台台式机 为了研究操作系统和硬件以及因为只有一台电脑我很多关于网络的想法无法立刻验证的困扰再加上后面可能会升级显卡用它跑模型搞ai

在研究台式机怎么联网时引发该思考

台式机联网通常有两种主要方法:

  1. 使用网线:将网线的一端插入台式机的网卡接口,另一端接入路由器或者交换机。通常台式机的主板上都带有网卡接口,可以直接插入网线。

  2. 装网卡开启WiFi功能:

  • 内置网卡:可以购买PCIe接口的无线网卡,安装在台式机的PCIe插槽中。

  • USB无线网卡:如果不想打开机箱,可以选择USB接口的无线网卡,直接插入台式机的USB口使用。

然后因为我只有一个老师的校园网账号 在12点后学生的校园网关闭了 只能用老师的校园网 再加上本月手机流量耗尽无法开热点………就出现了一个问题 我笔记本和台式机只能一个联网!(果然穷途末路是激发点子的又一关键) 于是我购入了一个usb无线网卡 并研究了一下路由器

路由器实际上是把一个人的校园网发散成wifi 然后那些装了路由器的人都是 一个人买校园卡 用那个人的号作为路由器里登入的账号 但是这样的话 和自己的账号一样 12点后就没用了 然后突发奇想 反正我用的老师的号 那不如 在路由器里面登入老师的号 发散信号 第一 不用月租无限流量 第二 12点后也能用 一下子整个寝室都不需要办校园卡了 成本只有一个100左右的路由器和一张厚脸皮(要老师的校园网)

在这个过程中 路由器的作用可以归纳为以下几点:

  1. 网络接入点:路由器首先作为连接到互联网的门户,通常通过WAN口与校园网或其他互联网服务提供商连接。

  2. IP地址分配:路由器使用DHCP(动态主机配置协议)自动为连接的设备分配私有IP地址,使设备能够在局域网内相互通信,并访问互联网。

  3. 网络地址转换(NAT):路由器执行NAT,允许多个设备共享一个公网IP地址进行互联网访问,这对于校园网环境尤其重要,因为通常只提供一个登录凭据。

  4. 数据流量管理:路由器管理和路由内部和外部网络的数据包,确保数据能够正确地从发送设备到达目标设备,无论是局域网内还是跨网络到互联网。

  5. 无线接入:内置的无线接入点提供Wi-Fi连接,允许无线设备加入网络,无需物理电缆连接。

  6. 安全与防护:路由器提供网络安全功能,包括防火墙、加密的无线访问(如WPA2/WPA3)、设备接入控制等,保护局域网不受外部威胁。

  7. 文件共享与服务发现:在局域网内,设备可以使用各种协议和服务(如SMB、NFS、Bonjour等)来发现彼此并共享文件或其他资源。

  8. 质量服务(QoS):如果路由器支持QoS,它可以根据数据包的类型或设备的重要性来优先处理网络流量,确保关键应用(如视频会议)获得必要的带宽。

总的来说,路由器在建立和管理寝室内无线局域网的过程中起着核心作用,它不仅提供了接入互联网的途径,还负责内部网络的管理和安全,同时也使得设备之间的通信和资源共享成为可能。

至于具体操作(进入后台等设置) 等待路由器到了再做更新

未完待续

——直接插上网线后 在wifi连接界面连接对应的网络 会弹出后台 进去设置一下密码就行

校园网的连接其实就是第一个登入者的号作为路由器的账号 只要验证一次即可

后面会把它的信号发散到各设备

image-5d166585

这里可以查看设备ip

是的 可以通过这个ip+端口访问某电脑上的项目

这就是局域网 就是我们常见的wifi

还有一个想法就是 是否可以把原本的各设备直连tailscale 变成使用路由器作为一个整体连接到tailscale 但是存在一个问题就是 ip该如何分配在这种情况下 有两层了 感觉对于目前的需求(设备量)来说没有必要 如果以后有多个网段 比如在a地有一堆设备 b地有一堆设备 c地又有一堆设备 全都按部分组就麻烦了 那就可以考虑使用路由器 将他们作为三个整体相连 好像互联网也就是这么回事吧 把一个一个局域网再往上走几层 连接在一起

想法二:能否用路由器实现全局翻墙 在路由器上下clash 然后设置一下转发规则 访问什么用转发 访问什么不转发 这样所有设备都可以很方便的上网而无需手动开关clash

可以实现 但是要刷机 所以暂时不弄 毕竟是新路由器 等快报废了再玩他

https://youtu.be/W9yiXcf8qok?si=JxnNSEFH47KEerzw

结语

在实践中探索是很美妙的事情 有好奇心的趋势 事半功倍

内容不是很完善 因为局限于当前探索到的地方 等待系统学习后 会细化每个模块 相信每个模块都是可以独立出好几篇文字出来的

至于为什么口吻很像是一种教学的感觉 没错 之后考虑会使用javaspring搭建一个网站 把这些知识点全录制出视频或者写出博客 发布在我的网站上 所以很早就开始蓄谋这件事情了 一步一步来吧 做好当下


⬅️ 网络知识探索 🏠 00-网络与项目 ➡️ 校园网寝室WIFI